<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>diversified_sampler 聚合 | ElasticSearch 7.7 权威指南中文版</title>
	<meta name="keywords" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <meta name="description" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
	<script>
	var _link = 'search-aggregations-bucket-diversified-sampler-aggregation.html';
    </script>
</head>
<body>
<div class="main-container">
    <section id="content">
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.7/search-aggregations-bucket-diversified-sampler-aggregation.html" rel="nofollow" target="_blank">https://www.elastic.co/guide/en/elasticsearch/reference/7.7/search-aggregations-bucket-diversified-sampler-aggregation.html</a>, 原文档版权归 www.elastic.co 所有<br/>本地英文版地址: <a href="../en/search-aggregations-bucket-diversified-sampler-aggregation.html" rel="nofollow" target="_blank">../en/search-aggregations-bucket-diversified-sampler-aggregation.html</a></div>
                        <!-- start body -->
                  <div class="page_header">
<strong>重要</strong>: 此版本不会发布额外的bug修复或文档更新。最新信息请参考 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html" rel="nofollow">当前版本文档</a>。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch 权威指南 [7.7]</a></span>
»
<span class="breadcrumb-link"><a href="search-aggregations.html">聚合</a></span>
»
<span class="breadcrumb-link"><a href="search-aggregations-bucket.html">桶(bucket)聚合</a></span>
»
<span class="breadcrumb-node">diversified_sampler 聚合</span>
</div>
<div class="navheader">
<span class="prev">
<a href="search-aggregations-bucket-daterange-aggregation.html">« date_range 聚合</a>
</span>
<span class="next">
<a href="search-aggregations-bucket-filter-aggregation.html">filter 聚合 »</a>
</span>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="search-aggregations-bucket-diversified-sampler-aggregation"></a>多样化取样(diversified_sampler)聚合
</h2>
</div></div></div>
<p>
与 <code class="literal">sampler</code> 聚合一样，这是一个过滤聚合，用于将任何子聚合的处理限制在得分最高的文档样本中。

<code class="literal">diversified_sampler</code> 聚合增加了限制共享一个公共值(如“author”)的匹配数量的能力。
</p>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>
任何一个优秀的市场调研人员都会告诉你，在处理数据样本时，重要的是样本要代表健康的各种观点，而不是被任何单一的声音所扭曲。

聚合也是如此，使用这些多样化的设置进行采样可以提供一种方法来消除内容中的偏见(人口过多的地理位置、时间轴上的一个大峰值或过于活跃的论坛垃圾邮件发送者)。
</p>
</div>
</div>
<div class="ulist itemizedlist">
<p class="title"><strong>用例示例：</strong></p>
<ul class="itemizedlist">
<li class="listitem">
将分析的焦点集中在高相关性匹配上，而不是潜在的低质量匹配长尾上
</li>
<li class="listitem">
通过确保公平呈现不同来源的内容，消除分析中的偏见
</li>
<li class="listitem">
降低仅使用样本（例如 <code class="literal">significant_terms</code>）即可产生有用结果的聚合的运行成本
</li>
</ul>
</div>
<p>
选择 <code class="literal">field</code> 或 <code class="literal">script</code> 设置来提供用于数据去重的值，<code class="literal">max_docs_per_value</code>设置控制在任何一个共享公共值的分片上收集的文档的最大数量。

<code class="literal">max_docs_per_value</code> 的默认设置为 <code class="literal">1</code>。
</p>
<p>如果选择的 <code class="literal">field</code> 或 <code class="literal">script</code> 为单个文档产生多个值，则聚合将引发错误(出于效率考虑，不支持使用多值字段进行去重)。</p>
<p>例如：</p>
<p>
我们可能想看看哪些标签与 StackOverflow 论坛帖子上的 <code class="literal">#elasticsearch</code> 密切相关，但忽略了一些高产用户倾向于将 #Kibana 拼写为 #Cabana 的影响。 
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /stackoverflow/_search?size=0
{
    "query": {
        "query_string": {
            "query": "tags:elasticsearch"
        }
    },
    "aggs": {
        "my_unbiased_sample": {
            "diversified_sampler": {
                "shard_size": 200,
                "field" : "author"
            },
            "aggs": {
                "keywords": {
                    "significant_terms": {
                        "field": "tags",
                        "exclude": ["elasticsearch"]
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/457.console"></div>
<p>响应：</p>
<div class="pre_wrapper lang-console-result">
<pre class="programlisting prettyprint lang-console-result">{
    ...
    "aggregations": {
        "my_unbiased_sample": {
            "doc_count": 151,<a id="CO226-1"></a><i class="conum" data-value="1"></i>
            "keywords": {<a id="CO226-2"></a><i class="conum" data-value="2"></i>
                "doc_count": 151,
                "bg_count": 650,
                "buckets": [
                    {
                        "key": "kibana",
                        "doc_count": 150,
                        "score": 2.213,
                        "bg_count": 200
                    }
                ]
            }
        }
    }
}</pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO226-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>一共抽样了151份分档。</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO226-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p><code class="literal">significant_terms</code> 聚合的结果不会因为任何一个作者的怪癖而扭曲，因为我们要求样本中的任何一个作者最多发表一篇文章。</p>
</td>
</tr>
</table>
</div>
<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_scripted_example"></a>脚本化示例：
</h3>
</div></div></div>
<p>
在这个场景下，我们可能希望对字段值的组合进行多样化。

我们可以使用一个 <code class="literal">script</code> 来产生一个 tags 字段中的多个值的哈希，以确保我们没有一个由相同的重复的 tag 组合组成的样本。
</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">POST /stackoverflow/_search?size=0
{
    "query": {
        "query_string": {
            "query": "tags:kibana"
        }
    },
    "aggs": {
        "my_unbiased_sample": {
            "diversified_sampler": {
                "shard_size": 200,
                "max_docs_per_value" : 3,
                "script" : {
                    "lang": "painless",
                    "source": "doc['tags'].hashCode()"
                }
            },
            "aggs": {
                "keywords": {
                    "significant_terms": {
                        "field": "tags",
                        "exclude": ["kibana"]
                    }
                }
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/458.console"></div>
<p>响应：</p>
<div class="pre_wrapper lang-console-result">
<pre class="programlisting prettyprint lang-console-result">{
    ...
    "aggregations": {
        "my_unbiased_sample": {
            "doc_count": 6,
            "keywords": {
                "doc_count": 6,
                "bg_count": 650,
                "buckets": [
                    {
                        "key": "logstash",
                        "doc_count": 3,
                        "score": 2.213,
                        "bg_count": 50
                    },
                    {
                        "key": "elasticsearch",
                        "doc_count": 3,
                        "score": 1.34,
                        "bg_count": 200
                    }
                ]
            }
        }
    }
}</pre>
</div>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_shard_size"></a>shard_size
</h3>
</div></div></div>
<p>参数 <code class="literal">shard_size</code> 限制了在每个分片上处理的样本中收集多少个得分最高的文档。默认值为 <code class="literal">100</code>。</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_max_docs_per_value"></a>max_docs_per_value
</h3>
</div></div></div>
<p><code class="literal">max_docs_per_value</code> 是一个可选参数，它限制每次选择数值去重时允许的文档数量。默认值为 <code class="literal">1</code>。</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_execution_hint"></a>execution_hint
</h3>
</div></div></div>
<p>
可选的 <code class="literal">execution_hint</code> 设置会影响用于值的去重的管理。

在执行去重时，每个选项最多可在内存中保存的个数为 <code class="literal">shard_size</code>，但保存的值的类型可以控制如下：
</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
直接保存字段值（<code class="literal">map</code>）
</li>
<li class="listitem">
保存由Lucene索引确定的字段序号（<code class="literal">global_ordinals</code>）
</li>
<li class="listitem">
保存字段值的哈希 - 这有可能导致哈希冲突（<code class="literal">bytes_hash</code>）
</li>
</ul>
</div>
<p>
如果这个信息可以从 Lucene 索引中获得，则默认是使用 <code class="literal">global_ordinals</code>，否则，就恢复使用 <code class="literal">map</code>。

<code class="literal">bytes_hash</code> 设置在某些情况下可能会更快，但由于可能会发生哈希冲突，因此可能会在去重逻辑中引入误报。

请注意，如果不适用，Elasticsearch 将忽略执行提示的选择，并且这些提示没有向后兼容性保证。
</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h3 class="title">
<a id="_limitations_3"></a>局限性
</h3>
</div></div></div>
<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="div-sampler-breadth-first-nested-agg"></a>不能在<code class="literal">breadth_first</code>聚合下嵌套
</h4>
</div></div></div>
<p>
作为一个基于质量的过滤器，<code class="literal">diversified_sampler</code> 聚合需要访问每个文档的相关性分数。

因此，它不能嵌套在将 <code class="literal">collect_mode</code> 从默认的<code class="literal">depth_first</code>模式切换到 <code class="literal">breadth_first</code> 模式的 <code class="literal">terms</code> 聚合下，因为这个模式下会丢弃分数。

在这种情况下，将会抛出一个错误。
</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="_limited_de_dup_logic"></a>有限的去重逻辑
</h4>
</div></div></div>
<p>去重逻辑仅适用于分片级别，因此不适用于所有分片。</p>
</div>

<div class="section">
<div class="titlepage"><div><div>
<h4 class="title">
<a id="spec-syntax-geo-date-fields"></a>geo/date 字段没有专门的语法
</h4>
</div></div></div>
<p>
目前，定义多样化值的语法是通过选择 <code class="literal">field</code> 或 <code class="literal">script</code> 来定义的——没有添加语法糖来表示 geo 或 date 单位，如“7d”(7天)。

此项支持可能会在以后的版本中添加，用户现在必须使用脚本来创建这些类型的值。
</p>
</div>

</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="search-aggregations-bucket-daterange-aggregation.html">« date_range 聚合</a>
</span>
<span class="next">
<a href="search-aggregations-bucket-filter-aggregation.html">filter 聚合 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>